home *** CD-ROM | disk | FTP | other *** search
- unit CompStream;
- {
- Delphi component streaming unit
- Author: David W. Body / Big Creek Software
- E-mail address: davidbody@bigcreek.com
- Original Version: August 4, 1997
- Last Updated: August 4, 1997
- This code is hereby placed in the public domain.
- }
-
- interface
-
- uses Classes;
-
- function ComponentToString(Component: TComponent): string;
- function StringToComponent(Value: string): TComponent;
- function ComponentToVariant(Component: TComponent): Variant;
- function VariantToComponent(Value: Variant): TComponent;
-
- implementation
-
- function ComponentToString(Component: TComponent): string;
- var
- BinStream: TMemoryStream;
- StrStream: TStringStream;
- s: string;
- begin
- BinStream := TMemoryStream.Create;
- try
- StrStream := TStringStream.Create(s);
- try
- BinStream.WriteComponent(Component);
- BinStream.Seek(0, soFromBeginning);
- ObjectBinaryToText(BinStream, StrStream);
- StrStream.Seek(0, soFromBeginning);
- Result := StrStream.DataString;
- finally
- StrStream.Free;
- end;
- finally
- BinStream.Free;
- end;
- end;
-
- function StringToComponent(Value: string): TComponent;
- var
- StrStream: TStringStream;
- BinStream: TMemoryStream;
- begin
- StrStream := TStringStream.Create(Value);
- try
- BinStream := TMemoryStream.Create;
- try
- ObjectTextToBinary(StrStream, BinStream);
- BinStream.Seek(0, soFromBeginning);
- Result := BinStream.ReadComponent(nil);
- finally
- BinStream.Free;
- end;
- finally
- StrStream.Free;
- end;
- end;
-
- function ComponentToVariant(Component: TComponent): Variant;
- var
- BinStream: TMemoryStream;
- Data: Pointer;
- begin
- BinStream := TMemoryStream.Create;
- try
- BinStream.WriteComponent(Component);
- Result := VarArrayCreate([0, BinStream.Size - 1], varByte);
- Data := VarArrayLock(Result);
- try
- Move(BinStream.Memory^, Data^, BinStream.Size);
- finally
- VarArrayUnlock(Result);
- end;
- finally
- BinStream.Free;
- end;
- end;
-
- function VariantToComponent(Value: Variant): TComponent;
- var
- BinStream: TMemoryStream;
- Data: Pointer;
- begin
- BinStream := TMemoryStream.Create;
- try
- Data := VarArrayLock(Value);
- try
- BinStream.WriteBuffer(Data^, VarArrayHighBound(Value, 1) + 1);
- finally
- VarArrayUnlock(Value);
- end;
- BinStream.Seek(0, soFromBeginning);
- Result := BinStream.ReadComponent(nil);
- finally
- BinStream.Free;
- end;
- end;
-
- end.
-